﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ShareIt_MVC3.Models;


namespace ShareIt_MVC3.Controllers
{
    /// <summary>
    /// // Dieser Controller dient zur Kontrolle der einzelnen Views in den Angelegenheiten der Ressourcen im speziellen und zur Weiterleitung auf diese.
    /// </summary>
    [Authorize]
    public class MyResourcesController : MainController
    {

        //
        // GET: /MyResources/MyShareIt

        /// <summary>
        /// Übersicht der eigenen Ressourcen.
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            MyShareItViewModel viewModel = new MyShareItViewModel();

            viewModel.MyUser = MyUser;
            viewModel.Credits = MyUser.Credits;
            viewModel.MyResources = resColl.GetAllResourcesByUserID(MyUser.ID);
            viewModel.BorrowedResources = lendColl.GetBorrowedResourcesByUserID(MyUser.ID);
            viewModel.BorrowedResourcesHistory = lendColl.GetBorrowedResourcesHistoryByUserID(MyUser.ID);
            viewModel.LentResourcesHistory = lendColl.GetLentResourcesHistoryByUserID(MyUser.ID);
            viewModel.LentResources = lendColl.GetLentResourcesByUserID(MyUser.ID);

            return View(viewModel);
        }

        /// <summary>
        /// Gibt wieder ob ein Buch ausleihbar ist.
        /// </summary>
        /// <returns></returns>
        public ActionResult Borrowable()
        {
            List<Resource> resources = resColl.GetBorrowableResources(MyUser.ID);
            return View(resources);
        }

        
        /// <summary>
        ///  Ressource ausleihen. Es werden verschiedene Daten persistenziert ( Ressource, leihender Benutzer, Tag des Ausleihens und Tag des Zurückgebens.)
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public ActionResult Borrow(int id) //resource id
        {
            Lending lending = new Lending
            {
                Resource = resColl.GetResourceByID(id),
                Lender = MyUser,
                DateOfLending = DateTime.Now.ToString(),
                DateOfReturning = null
            };

            return View(lending);
        }

        /// <summary>
        /// Ausleihen eines Buches, indem die ID übergeben wird und ein neues lending-Objekt erzeugt wird.
        /// </summary>
        /// <param name="id"></param>
        /// <param name="lending"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Borrow(int id, Lending lending)
        {
            // Der Benutzer soll nur ausleihen können, wenn er im Besitz von Credits ist.
            if (MyUser.Credits <= 0)
                return View("NotEnoughCredits");

            // wenn die Resource bereits verliehen ist, brich ab!
            if (lendColl.GetLendingForResource(id) != null)
                return View("Unavailable");

            Lending _lending = new Lending
            {
                Resource = resColl.GetResourceByID(id),
                Lender = MyUser,
                DateOfLending = DateTime.Now.ToString(),
                DateOfReturning = null
            };


            try
            {
                lendColl.InsertLending(_lending);

                userColl.IncrementUserCredits(_lending.Resource.Owner);
                userColl.DecrementUserCredits(MyUser);
            }
            catch
            {
                ViewBag.ErrorMessage("Something failed. Sorry.");
                return View("Shared/_Error");
            }

            return View("BorrowSuccess", _lending);
        }

        /// <summary>
        /// Methode für das "zurück erhalten" einer Resource
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public ActionResult Reacquire(int id) { // lending id
            Lending lending = lendColl.GetLendingById(id);
            return View(lending);
        }

        /// <summary>
        /// Methode zum Zurückerhalten von Ressourcen. Dabei wird auch ein neuer Zeitstempel erzeugt.
        /// </summary>
        /// <param name="id"></param>
        /// <param name="lending"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Reacquire(int id, Lending lending)
        {
            try
            {
                Lending _lending = lendColl.GetLendingById(id);
                _lending.DateOfReturning = DateTime.Now.ToString();
                lendColl.UpdateLending(_lending);
                return RedirectToAction("index");
            }
            catch
            {
                return View("Shared/_Error");
            }
        }


        // Hilfsmethode
        [Authorize]
        public ActionResult MyUserEdit()
        {
            return PartialView(MyUser);
        }
    }
}
